<?php

/**
 * Többnyelvűséget támogató tábla objektum
 *
 * Értéke a tábla nevének részeinek egyszerű felsorolása lehet,
 * amelyet a használni kívánt nyelv két karakteres azonosítója követ. A
 * nyelvazonosító paraméter minden esetben a legutolsó paraméter legyen!
 *
 * Példa:
 * <code>
 * $o->addKeyField(XQL_Field::create()->set('id'))->set('db', 'table', 'hu');
 * </code>
 * kimenete:
 * (`db`.`table` `mytable` LEFT JOIN `db`.`tableLangData_hu` ON `db`.`table`.`id` = `db`.`tableLangData_hu`.`id`))
 *
 * @author prometheus
 */
class XQL_TableLang extends XQL_Table
{
	/**
	 * Az eredeti tábla elsődleges kulcsának mezői, melyek a nyelvi táblában
	 * is szerepelnek.
	 * @var array
	 */
	protected $keyFields = array();

	/**
	 * Amennyiben a tulajdonság értéke FALSE, az objektum csak a tábla nevét
	 * fogja visszaadni. Ellenkező esetben LEFT JOIN kapcsolattal hozzárendeli
	 * a főtáblához a nyelvi táblát a megadott kulcsok szerint.
	 * @var bool
	 */
	protected $joinedFormat = TRUE;

	/**
	 * Visszatér egy példánnyal ugyanebből az osztályból.
	 *
	 * @return XQL_TableLang
	 */
	public static function create()
	{
		return new XQL_TableLang();
	}

	/**
	 * Kizárólag ennek az objektumnak az értékével tér vissza. Implementációja
	 * kötelező. A további megvalósításokban ügyelni kell arra, hogy az egyes
	 * érték elemek akár olyan objektumok is lehetnek, amelyek string-ként
	 * térhetnek vissza (például más XQL_Object leszármazottak).
	 *
	 * @return string
	 */
	public function get()
	{
		$value = $this->objectValue;
		$lang = array_pop($value);
		$value = array();
		$valueLang = array();
		$toJoin = '';
		$as = '';
		$result = '';
		$baseTable = '';
		$cnt = 0;
		$keyFields = array();
		$on = '';

		foreach ($this->objectValue as $k=>$v)
		{
			if ($k !== 'as')
			{
				$value[] = $v;
			}
			else
			{
				$as = (is_object($value['as'])? (string)$value['as'] : '`'.(string)$value['as'].'`');
			}
		}

		foreach ($value as $k=>$v)
		{
			$prefix = ($k == (count($value)-1)? $this->connection->tablePrefix : '');
			$suffix = ($k == (count($value)-1)? 'LangData_'.$lang : '');
			$value[$k] = (is_object($v)? (string)$v : '`'.$prefix.(string)$v.'`');
			$valueLang[$k] = (is_object($v)? (string)$v : '`'.$prefix.(string)$v.$suffix.'`');
		}
		
		if (count($value) == 1)
		{
			$baseTable = $value[0];
			$toJoin = $valueLang[0];
		} else if (count($value) == 2)
		{
			$baseTable = $value[0].'.'.$value[1];
			$toJoin = $valueLang[0].'.'.$valueLang[1];
		}

		if ($this->joinedFormat)
		{
			foreach ($this->keyFields as $field)
			{
				$keyFields[] = $baseTable.'.'.(string)$field.' = '.$toJoin.'.'.(string)$field;
			}

			$on = implode(' AND ', $keyFields);

			if (!empty($as))
			{
				$baseTable .= ' `'.$as.'`';
			}

			$result = '('.$baseTable.' LEFT JOIN '.$toJoin.' ON ('.$on.'))';
		}
		else
		{
			$result = $toJoin;
		}

		return $result;
	}

	/**
	 * Kulcs mezőobjektumot rendel a nyelvi táblához. A hozzárendelt objektumban
	 * nem szerepelhet táblanév, mivel ebben az objektumban lévő táblához fog
	 * tartozni értelemszerűen.
	 *
	 * @param XQL_Field $field
	 * @return XQL_TableLang
	 */
	public function addKeyField($field)
	{
		$this->keyFields[] = $field;
		return $this;
	}

	/**
	 * beállítja, hogy az objektum csak a tábla nevét adja majd vissza.
	 * @return XQL_TableLang
	 */
	public function onlyTableName()
	{
		$this->joinedFormat = FALSE;
	}
}
?>